/*
 * Copyright (C) 2009 2DAI
 *
 * Este programa es Software Libre; usted puede redistribuirlo
 * y/o modificarlo bajo los términos de la "GNU General Public
 * License" como lo publica la "FSF Free Software Foundation",
 * o (a su elección) de cualquier versión posterior.
 *
 * Este programa es distribuido con la esperanza de que le será
 * útil, pero SIN NINGUNA GARANTIA; incluso sin la garantía
 * implícita por el MERCADEO o EJERCICIO DE ALGUN PROPOSITO en
 * particular. Vea la "GNU General Public License" para más
 * detalles.
 *
 * Usted debe haber recibido una copia de la "GNU General Public
 * License" junto con este programa, si no, escriba a la "FSF
 * Free Software Foundation, Inc.", 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 */
package logic;

import gui.AcercaDe;
import gui.LoggeriFrame;
import gui.MainWindow;
import gui.MaintClubRepresentatives;
import gui.Options;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import util.Errors;
import util.WindowStyle;

/**
 *
 * Author: Jorge Garrido Oval
 * Colaborated: Pablo Martinez Piles
 * Logica de la ventana principal, maneja desde la botonera, la barra de carga
 * hasta el trayIcon pasando por la logica de ventanas.
 */
public class MainWindowLogic extends SwingWorker implements ActionListener, PropertyChangeListener, MouseListener {

    private MainWindow mw;
    private JProgressBar pb;
    private TableLogic tl;
    private WindowStyle ws;
    private SplashLogic splas;
    private TrayIcon sysTry;
    private String estadoCarga;
    protected int procesos = 0;

    /**
     * 
     * @param splas
     */
    public MainWindowLogic(SplashLogic splas) {
        this.splas = splas;
        this.addPropertyChangeListener(this.splas);
        mw = new MainWindow(this);
    }

    /**
     * Muestra el icono el la barra de tareas tanto de Windows como de Linux
     * (Mac en pruebas...)
     */
    public void iconoTareas() {
        final PopupMenu menuSys = new PopupMenu();
        MenuItem salir = new MenuItem("Salir");
        salir.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        MenuItem opciones = new MenuItem("Opciones");
        opciones.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                Options opt = new Options();
                opt.setVisible(true);
            }
        });
        MenuItem mostrar = new MenuItem("Mostrar");
        mostrar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                mw.setExtendedState(JFrame.MAXIMIZED_BOTH);
                mw.ponerFullScreen();
                mw.setVisible(true);
            }
        });
        menuSys.add(mostrar);
        menuSys.add(opciones);
        menuSys.add(salir);
        Toolkit e = Toolkit.getDefaultToolkit();
        Image icono = e.createImage(getClass().getResource("/img/16x16/apps/karm.png"));
        sysTry = new TrayIcon(icono, "Seleccione opción", menuSys);
        sysTry.addMouseListener(this);
        SystemTray tray = SystemTray.getSystemTray();
        try {
            tray.add(sysTry);
        } catch (AWTException ex) {
            Errors.creaAdvertencia("No se ha podido crear el icono en la barra de tareas", ex.getStackTrace());
        }
        //new TestRobot().start();
    }

    /**
     * Pone el mensaje deseado en el icono de la barra de tareas mediante un globo de texto
     * @param titulo Titulo para el globo
     * @param mensaje El mensaje principal del globo
     * @param tipo El tipo de mensaje de trayIcon
     */
    private void mensajeIconoTareas(String titulo, String mensaje, TrayIcon.MessageType tipo) {
        if(titulo!=null)
            sysTry.displayMessage(titulo,mensaje,tipo);
        else{
        sysTry.displayMessage("La aplicación seguirá ejecutandose",
                "La apliación Ping Pong Manager seguirá en ejecución en segundo plano, " +
                "para volver a mostrarla o salir de la misma pulse en el icono con el " +
                "botón derecho del ratón y seleccione la opción correspondiente.",
                TrayIcon.MessageType.INFO);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Locales")) {
            new AbsThread(0, mw, this, "Locales").start();
        } else if (e.getActionCommand().equals("Clubs")) {
            new AbsThread(1, mw, this, "Clubs").start();
        } else if (e.getActionCommand().equals("Jugadores")) {
            new AbsThread(2, mw, this, "Jugadores").start();
        } else if (e.getActionCommand().equals("Arbitros")) {
            new AbsThread(4, mw, this, "Arbitros").start();
        } else if (e.getActionCommand().equals("Equipos")) {
            new AbsThread(3, mw, this, "Equipos").start();
        } else if (e.getActionCommand().equals("Representantes Club")) {
            new AbsThread(5, mw, this, "Representantes Club").start();
        } else if (e.getActionCommand().equals("Clasequipos")) {
            if (tl.getOpcion() != 0) {
                tl = new TableLogic(mw, "Clasificación de Equipos", 0);
                tl.addPropertyChangeListener(this);
                tl.execute();
            } else {
                tl.setVisible();
            }
        } else if (e.getActionCommand().equals("Calendario")) {
            if (tl.getOpcion() != 1) {
                tl = new TableLogic(mw, "Calendario de eventos", 1);
                tl.addPropertyChangeListener(this);
                tl.execute();
            } else {
                tl.setVisible();
            }
        } else if (e.getActionCommand().equals("Ranking")) {
            if (tl.getOpcion() != 2) {
                tl = new TableLogic(mw, "Clasificación individual", 2);
                tl.addPropertyChangeListener(this);
                tl.execute();
            } else {
                tl.setVisible();
            }
        } else if (e.getActionCommand().equals("Log")) {
            LoggeriFrame loger = new LoggeriFrame();
            this.mw.getJDPescritorio().add(loger);
            loger.setVisible(true);
        } else if(e.getActionCommand().equals("Acta")){
            RecordLogic rl = new RecordLogic(mw,3);
            rl.addPropertyChangeListener(this);
            rl.execute();
        } else if (e.getActionCommand().equals("Acerca De")) {
            AcercaDe acerca = new AcercaDe();
            this.mw.getJDPescritorio().add(acerca);
            acerca.setVisible(true);
        } else if (e.getActionCommand().equals("Config")) {
            Options opt = new Options();
            this.mw.getJDPescritorio().add(opt);
            opt.setVisible(true);
        } else if (e.getActionCommand().equals("Representantes Club")) {
            MaintClubRepresentatives clubr = new MaintClubRepresentatives();
            this.mw.getJDPescritorio().add(clubr);
            clubr.setVisible(true);
            this.mw.repaint();
        } else if (e.getActionCommand().equals("Salir")) {
            SystemTray tray = SystemTray.getSystemTray();
            tray.remove(sysTry);
            System.exit(0);
        }
    }

    /**
     * Recibe el cambio de propiedad de los internals y cambia la barra
     * además de controlar el numero de procesos en ejecución.
     * @param evt
     */
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("progress")) {
            pb.setStringPainted(true);
            pb.setForeground(Color.MAGENTA);
            pb.setFont(new Font(Font.DIALOG,Font.BOLD,12));
            int progress = (Integer) evt.getNewValue();
            pb.setIndeterminate(true);
            if (progress == 100) {
                procesos--;
                pb.setString("Cargando "+procesos+" tarea/s...");
                if(procesos<1){
                    pb.setIndeterminate(false);
                    pb.setStringPainted(false);
                }
                this.mensajeIconoTareas("Estado de cargas de procesos",
                        "Ping Pong Manager ha terminado de cargar la infomación que usted a solicitado, " +
                        "doble click en el icono para volver a mostrar la aplicación.",
                        TrayIcon.MessageType.INFO);
            }else if (progress == 50) {
                this.ws.ordenarVentanas();
                procesos++;
                pb.setString("Cargando "+procesos+" tarea/s...");
            }
        }
    }

    @Override
    protected Object doInBackground() throws Exception {
        this.splas.getSplas().setCursor(new Cursor(Cursor.WAIT_CURSOR));
        for (int cont = 0; cont <= 100; cont++) {
            switch (cont) {
                case 0:
                    pb = mw.getJPBcargando();
                    estadoCarga="Cargando propiedades...";
                    break;
                case 20:
                    tl = new TableLogic();
                    estadoCarga="Inicializando lógica de tablas...";
                    break;
                case 40:
                    tl = new TableLogic();
                    estadoCarga="Inicializando lógica de tablas...";
                    break;
                case 80:
                    ws = new WindowStyle(mw.getJDPescritorio());
                    estadoCarga="Inicializando estilo de la ventana...";
                    break;
                case 100:
                    new LoginLogic(mw,this);
                    estadoCarga="Cargando panel de identificación...";
                    break;
            }
            setProgress(cont);
            Thread.sleep(20);
        }
        this.splas.getSplas().setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        return null;
    }

    /**
     * Método sobreescrito que nos permitirá controlar cuando el ratón clickee
     * @param e
     */
    public void mouseClicked(MouseEvent e) {
        JButton boton = (JButton) e.getComponent();
        if (boton == this.mw.getSalir()) {
            System.exit(0);
        } else if (boton == this.mw.getMinimizar()) {
            mw.setVisible(false);
            this.mw.setState(1);
            this.mensajeIconoTareas(null, null, TrayIcon.MessageType.INFO);
        } else if (e.getClickCount() == 2) {
            mw.setExtendedState(JFrame.MAXIMIZED_BOTH);
            mw.setVisible(true);
        }
    }

    /**
     * Método sobreescrito que nos permitirá controlar cuando el ratón presione
     * @param e
     */
    public void mousePressed(MouseEvent e) {}

    /**
     * Método sobreescrito que nos permitirá controlar cuando el ratón peste encima
     * @param e
     */
    public void mouseReleased(MouseEvent e) {}

    /**
     * Método sobreescrito que nos permitirá controlar cuando el ratón entre en el componenete
     * @param e
     */
    public void mouseEntered(MouseEvent e) {
        JButton boton = (JButton) e.getComponent();
        if (boton == this.mw.getSalir()) {
            mw.getSalir().setIcon(new ImageIcon((getClass().getResource("/img/16x16/actions/ledred1.png"))));
        } else if (boton == this.mw.getMinimizar()) {
            mw.getMinimizar().setIcon(new ImageIcon((getClass().getResource("/img/16x16/actions/ledyellow1.png"))));
        }
    }

    /**
     * Método sobreescrito que nos permitirá controlar cuando el ratón salga del componente
     * @param e
     */
    public void mouseExited(MouseEvent e) {
        JButton boton = (JButton) e.getComponent();
        if (boton == this.mw.getSalir()) {
            mw.getSalir().setIcon(new ImageIcon((getClass().getResource("/img/16x16/actions/ledred.png"))));
        } else if (boton == this.mw.getMinimizar()) {
            mw.getMinimizar().setIcon(new ImageIcon((getClass().getResource("/img/16x16/actions/ledyellow.png"))));
        }
    }

    /**
     * @return el estadoCarga
     */
    public String getEstadoCarga() {
        return estadoCarga;
    }
}
